import demo1 from './demo.json' assert { type: "json" };
import demo2 from './demo2.json' assert { type: "json" };

// console.log(demo1);
// console.log(demo2);



/**
 * 编排json  --- 构造原始数据和保存到cgclass里面后的两端的数据对应关系
 * 
 *  1.调用完函数得到目标json或者json字符串，将其放到弹出层的列表上
 *  2.将文件上传完后，构造一个文件上传后的id和原始文件名的对应关系
 *  3. 然后就进行该函数返回的json和文件上传完后的json对比，构造一个[直接通过URL匹配，成功则认为 ’已找到‘ ]页面显示关系+后续的保存关系。
 * 
 *  【【 BUG： 对于同名的大纲名称、课时名称、资料名称、作业名称均会出现BUG，因为都是基于数据名称进行匹配。】】
 * 
 * 
 * @param {*} alreadyData 已经导入的json
 * @param {*} originalData 原始json
 */
function arrangeJSON(alreadyData, originalData) {
    let data = alreadyData.length > 0 ? alreadyData[0] : alreadyData ? alreadyData : {};
    let original = originalData.length > 0 ? originalData[0] : originalData ? originalData : {};
    
    if (original.original__data) {
        let json = JSON.parse(original.original__data);
        let base = {
            id: data.bk_id,
            url: json["resource"].url,
            name: json["resource"].name,
            major: json["resource"].major,
        }
        // console.log("base:",json["resource_id"]);
        let sections = buildSections(data, json);
        let materials = data.material ? buildMaterials(data.material, json) : {};
        let operations = data.operation ? buildOperations(data.operation, json) : {};


        // console.log("base:",base); // 作业
        // console.log("sections:", sections); //课时
        // console.log("materials:", materials); // 资料
        // console.log("operations:", operations); // 作业
        /**
         * 
         * 
         
        、
1. 调用demo3.js【假设没bug】里面的逻辑，拿到想要更新的业务模块的对象，比如说现在要更新作业。 
operations: {
  '7278590697228345339': {
    id: '7278590697228345339',
    name: 'rttre',
    original_id: 2,
    content: '<p>retretr</p>',
    minioInfos: '[{"url":"http://120.224.9.197:51038/reslib-prod/dev_banke_zyk/other/2024/08/09/c90db8e4-f46d-4ffb-8a62-7b926fe07f26.png","size":"377084","minioId":"1821720136843747330","customName":"10.png"}]'
  }
}



2. 文件上传    获取fileid

3. 需要根据上传的文件名   1273818273.jpg 去匹配 operations里面也叫找个名称的对象 比如说上面的对象  

4. 取到id: '7278590697228345339', 即即将更新的业务id ，business_id 。 

5. 调用bind_file接口  
        传递   第四步的id   fileid   业务类型  文件类型  


6.go!

         */

        
        return {
            sections,
            materials,
            operations
        };
    }
    
    return null;
}


/**
 * 匹配课时
 * 只会出现带有附件的，减少匹配难度
 * @param {} data 
 * @param {*} json 
 * @returns 
 */
function buildSections(data,json){
    // 存储最终的映射关系
    const mappings = {};
    // 先从demo.json获取所有课时ID和名称的对应关系
    const demoMappings = {};
    if (data.section) {
        Object.entries(data.section).forEach(([key, value]) => {
            demoMappings[value] = key;
        });
    }

    // 遍历original_data中的课时信息
    json.outlines.forEach(outline => {
        if (outline && outline.sections) {
            outline.sections.forEach(section => {
                if (section.details && section.details.length > 0) {
                    // 在demo.json中查找对应的课时ID
                    const demoSectionId = demoMappings[section.name];
                    
                    if (demoSectionId) {
                        mappings[demoSectionId] = createSectionMapping(
                            section,
                            demoSectionId,
                            outline.name
                        );
                    }
                }
            });
        }
    });

    // console.log("课时对应关系:", mappings);
    return mappings;
}
/**
 * 创建课时映射关系
 * @param {Object} section 课时信息
 * @param {string} demoSectionId demo.json中的课时ID
 * @param {string} outlineName 大纲名称
 * @returns {Object} 映射关系对象
 */
function createSectionMapping(section, demoSectionId, outlineName) {
    // 收集所有details中的minioInfos
    const allMinioInfos = section.details.reduce((acc, detail) => {
        if (detail.minioInfos) {
            acc.push(...detail.minioInfos);
        }
        return acc;
    }, []);

    return {
        original_id: section.id,
        name: section.name,
        minioInfos: JSON.stringify(allMinioInfos),
        outline_name: outlineName
    };
}

/**
 * 处理材料映射关系
 * @param {Object} materialData demo1中的material数据
 * @param {Object} jsonData demo2中的json数据
 * @returns {Object} 材料映射关系
 */
function buildMaterials(materialData, jsonData) {
    const materialMappings = {};

    // 遍历demo1中的material数据
    Object.entries(materialData).forEach(([materialId, fileName]) => {
        // 在json.outlines中查找匹配的文件
        jsonData.outlines.forEach(outline => {
            if (outline.sections) {
                outline.sections.forEach(section => {
                    if (section.details) {
                        section.details.forEach(detail => {
                            if (detail.minioInfos) {
                                detail.minioInfos.forEach(info => {
                                    if (info.customName === fileName) {
                                        materialMappings[materialId] = {
                                            id: materialId,
                                            name: fileName,
                                            minioInfo: info,
                                            outline_name: outline.name
                                        };
                                    }
                                });
                            }
                        });
                    }
                });
            }
        });
    });
    console.log(materialMappings);
    return materialMappings;
}

/**
 * 处理作业映射关系
 * @param {Object} operationData demo1中的operation数据
 * @param {Object} jsonData demo2中的json数据
 * @returns {Object} 作业映射关系
 */
function buildOperations(operationData, jsonData) {
    const operationMappings = {};
    
    // 遍历demo1中的operation数据
    Object.entries(operationData).forEach(([operationId, operationName]) => {
        // 在jsonData.operations中查找匹配的作业
        if (jsonData.operations) {
            jsonData.operations.forEach(operation => {
                if (operation.name === operationName) {
                    operationMappings[operationId] = {
                        id: operationId,
                        name: operationName,
                        original_id: operation.id,
                        content: operation.details?.[0]?.content || null,
                        minioInfos: JSON.stringify(operation.details?.[0]?.minioInfos || []),
                    };
                }
            });
        }
    });
    
    return operationMappings;
}

arrangeJSON(demo1, demo2);